servers migrations.md
---------------------
1. What you actually pay for today

Hetzner (46.62.228.173 — “hetzner_dokploy”)
From your console and our checks:

┌────────────────────────┬────────────────────────────────────────────────────────────────────────────┐
│ Item                   │ Approx                                                                     │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ Plan                   │ CPX42-class: 8 vCPU / 16 GB RAM / ~320 GB NVMe                             │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ List price             │ ~€29.99/mo (~$33) before VAT/taxes                                         │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ Your felt cost         │ ~$40/mo (VAT + Storage Box / extras is a realistic total)                  │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ Disk use (when online) │ ~48 GB / 301 GB (~17%) — disk is not your bottleneck                       │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ RAM use (when online)  │ ~5.6 GB used / ~15 GB — headroom exists, but TTS spikes matter             │
├────────────────────────┼────────────────────────────────────────────────────────────────────────────┤
│ Network event          │ IP null-routed for unpaid invoice — whole public site went dark until paid │
└────────────────────────┴────────────────────────────────────────────────────────────────────────────┘

What lives here (high value):
• ielts.fast stack: Docker webapp, PocketBase, TTS (~multi‑GB RSS), speaking analysis, telegram notifier
• Promedic: coach / diet / clinical / drugs / female (+ Caddy)
• dom.promedic1.com domains hub, credentials hub (credo), other promedic subdomains

Contabo (149.102.150.185 — main Contabo)
┌─────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Item    │ What we know from ops                                                                                                                      │
├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Role    │ Large multi-site host: Master1, education banks, dentist, tourism, many *.addict.best                                                      │
├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Pricing │ Typically cheaper €/$ per GB RAM than Hetzner Cloud for similar “fat” VPS SKUs (exact price depends on your Contabo invoice — check panel) │
├─────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Style   │ More “budget cloud”; support/network reputation is mixed in the industry; still can lock for abuse/non-payment                             │
└─────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

You also have ai-developer (213.199.36.17) — separate machine (prompts hub, etc.). Migration “to Contabo” usually means 149 (and maybe 213), not “one magical server.”

───

2. Is Hetzner “too expensive”?

For a generic static site: yes, $40 is high.
For your IELTS + TTS + multi-app production node: $40 is in the normal band for 16 GB EU cloud, not luxury.

What you’re buying on Hetzner Cloud specifically:

┌───────────────────────────────────────────┬──────────────────────────────────────────────────────┐
│ Strength                                  │ Why it matters to you                                │
├───────────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Predictable EU networking                 │ Public apps + Let’s Encrypt reliability              │
├───────────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Clean ops (Caddy, systemd, Docker worked) │ Less mystery debugging                               │
├───────────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Performance consistency                   │ Better than many ultra-budget hypervisors under load │
├───────────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Storage Box + restic already wired        │ Offsite backups exist                                │
├───────────────────────────────────────────┼──────────────────────────────────────────────────────┤
│ Strict billing enforcement                │ Painful when unpaid, but you know the failure mode   │
└───────────────────────────────────────────┴──────────────────────────────────────────────────────┘

What hurts:

┌─────────────────────────────────┬─────────────────────────────────────────┐
│ Pain                            │ Reality                                 │
├─────────────────────────────────┼─────────────────────────────────────────┤
│ Price vs Contabo                │ Contabo often undercuts for similar RAM │
├─────────────────────────────────┼─────────────────────────────────────────┤
│ Null-route on unpaid            │ Total outage of all domains on that IP  │
├─────────────────────────────────┼─────────────────────────────────────────┤
│ “One fat server for everything” │ Single point of failure                 │
└─────────────────────────────────┴─────────────────────────────────────────┘

Bottom line on price alone:
If you only need static Promedic pages, Hetzner is overkill.
If you need IELTS TTS + concurrent PB + Docker with headroom, 16 GB is the real requirement, not the brand. Whoever gives you stable 16 GB + good disk I/O wins.

───
3. Contabo-only — is that the recommendation?

Short answer
Not “Contabo only” as a blind default.
Yes “consider Contabo (or similar budget 16 GB) as primary if price is the #1 constraint” — if you migrate carefully and keep backups.

Longer answer

┌─────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Recommendation tier │ Meaning                                                                                                   │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Best pure cost cut  │ Move compatible apps to Contabo; downsize or cancel Hetzner only after cutover proven                     │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Best risk balance   │ Keep Hetzner for IELTS/TTS (or any heavy ML) + Contabo for Master1/static — two bills, lower blast radius │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Worst idea          │ “Dump everything on Contabo tomorrow” without inventory, RAM test, DNS TTL plan, backup restore drill     │
└─────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────┘

Contabo is fine as a host for much of what you run (Caddy, static sites, PocketBase, Node, Docker light stacks). Contabo is riskier as the only home for a memory-hungry TTS stack unless you buy an equivalently fat plan and load-test it.

───

4. Can you migrate apps to Contabo correctly?

Yes — if you treat migration as a project, not a copy-paste.
Your estate is multi-domain, multi-service. “Correct” means:

1. Inventory
2. Capacity check
3. Staging on Contabo
4. Parallel run
5. DNS cutover
6. Decommission Hetzner only after soak time

4.1 What migrates easily
┌────────────────────────────────┬─────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────┐
│ App type                       │ Examples                                                        │ Why easy                                     │
├────────────────────────────────┼─────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────┤
│ Static / SPA                   │ clinical, drugs, female, many Promedic HTML, domains-hub, credo │ rsync /var/www + Caddy site blocks + TLS     │
├────────────────────────────────┼─────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────┤
│ Simple Node/static             │ landing pages, catalogs                                         │ low RAM                                      │
├────────────────────────────────┼─────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────┤
│ PocketBase (if not huge media) │ diet/coach PB patterns                                          │ copy pb_data carefully + same version binary │
├────────────────────────────────┼─────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────┤
│ Caddy reverse proxies          │ if backends move with them                                      │ config is portable                           │
└────────────────────────────────┴─────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────┘

4.2 What migrates with care
┌──────────────────────┬─────────────────────────────────────────────┬────────────────────────────────────────────┐
│ App type             │ Examples                                    │ Risks                                      │
├──────────────────────┼─────────────────────────────────────────────┼────────────────────────────────────────────┤
│ Docker apps          │ webapp_ielts, the-ielts                     │ image load, volume mounts, env secrets     │
├──────────────────────┼─────────────────────────────────────────────┼────────────────────────────────────────────┤
│ Multiple PocketBases │ ielts/diet/coach                            │ ports, users, hooks, backups, SQLite locks │
├──────────────────────┼─────────────────────────────────────────────┼────────────────────────────────────────────┤
│ Cron + systemd       │ restic, health watchdogs, telegram-notifier │ paths, secrets, timers must be recreated   │
└──────────────────────┴─────────────────────────────────────────────┴────────────────────────────────────────────┘

4.3 What migrates hard / expensive
┌─────────────────────────────────────┬──────────────────────────────────┬─────────────────────────────────────────────────────────────┐
│ App type                            │ Examples                         │ Why                                                         │
├─────────────────────────────────────┼──────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ IELTS TTS                           │ ielts-tts (XTTS-class, multi‑GB) │ RAM, disk for models, cold-start time, CPU/GPU expectations │
├─────────────────────────────────────┼──────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ Heavy Python analysis               │ speaking analysis workers        │ concurrent load with TTS                                    │
├─────────────────────────────────────┼──────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ Anything assuming Hetzner paths/IPs │ hard-coded IPs in docs/apps      │ DNS + config sweep                                          │
└─────────────────────────────────────┴──────────────────────────────────┴─────────────────────────────────────────────────────────────┘

Rule: If Contabo plan is <12–16 GB, do not park TTS there without a redesign (external TTS API, smaller model, or separate box).

───

5. Full comparison matrix (your use case)

┌───────────────────────────┬────────────────────────────────────────┬──────────────────────────────────────────────────────────────────────┬───────────────────────────────┐
│ Dimension                 │ Hetzner (current ~$40)                 │ Contabo (typical cheaper fat VPS)                                    │ Winner for you                │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ € per GB RAM              │ Higher                                 │ Usually lower                                                        │ Contabo (cost)                │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Suitability for TTS+IELTS │ Proven on your box                     │ Unknown until tested on your SKU                                     │ Hetzner (proven)              │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Static multi-site         │ Excellent                              │ Excellent                                                            │ Tie                           │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Support / process         │ Structured Cloud + Robot               │ Variable                                                             │ Hetzner slightly              │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Abuse/billing lock        │ Strict null-route                      │ Can lock too; less “polished” process                                │ Neither “nice”                │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Network reputation        │ Strong EU cloud                        │ Mixed budget reputation                                              │ Hetzner slightly              │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ You already invested      │ Full IELTS+Promedic live               │ Full Master1/education live                                          │ Split brain today             │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Single-vendor simplicity  │ One IP for many promedic/ielts domains │ One IP for many addict/master1 domains                               │ Depends on consolidation goal │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Backup story              │ restic → Storage Box already           │ Need equal offsite (restic/S3/Storage Box still usable from Contabo) │ Hetzner today                 │
├───────────────────────────┼────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┼───────────────────────────────┤
│ Migration effort          │ N/A (source of truth now)              │ Days–weeks careful work                                              │ Contabo costs time            │
└───────────────────────────┴────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┴───────────────────────────────┘
6. “Only Contabo” scenarios — when it makes sense

Only Contabo is reasonable if all of these are true:

1. Contabo invoice for ≥16 GB RAM (ideally more if TTS + analysis + PB concurrent) is meaningfully cheaper than ~$40 after VAT.
2. You run a restore drill: restic/app-stack-exports → Contabo → ielts.fast health checks pass.
3. You accept one weekend of risk and possible TTS slower/OOM until tuned.
4. You update all DNS A records that currently point at 46.62.228.173.
5. You keep offsite backups independent of Contabo disk (Storage Box or other).

Only Contabo is a bad idea if:

• You pick an 8 GB Contabo “deal” to save money → IELTS TTS will thrash/OOM.
• You migrate DNS first, fix later.
• You have no tested backup restore.
• You need zero downtime (you’d need parallel run + low TTL).

───
7. Recommended strategic visions (choose one philosophy)

Vision A — Cost cutter (Contabo primary)
• Contabo becomes home for almost everything.
• Hetzner canceled after 2–4 weeks of stable dual-run.
• Savings: possibly €10–25/mo depending on Contabo plan.
• Cost in risk: one platform outage / performance regression hits all.
• Best if: money is tight and you’ll buy a true 16 GB+ Contabo.

Vision B — Split by workload (best engineering balance) ★ often best
┌──────────────────────┬────────────────────────────────────────────────────────────┐
│ Host                 │ Keep / put                                                 │
├──────────────────────┼────────────────────────────────────────────────────────────┤
│ Hetzner              │ IELTS + TTS + analysis only (or Hetzner downsized later)   │
├──────────────────────┼────────────────────────────────────────────────────────────┤
│ Contabo              │ Static Promedic, hubs, Master1, education, addict landings │
├──────────────────────┼────────────────────────────────────────────────────────────┤
│ Storage Box / restic │ Offsite forever                                            │
└──────────────────────┴────────────────────────────────────────────
• Savings: less than full cancel, but you can downsize Hetzner later if only TTS remains.
• Risk: lower blast radius (what already bit you: one unpaid IP = everything dark).
• Best if: IELTS revenue/reputation matters more than max savings.

Vision C — Stay Hetzner, stop bleeding money on process
• Keep Hetzner.
• Fix auto-pay + invoice alerts (the $40 outage was billing, not hardware).
• Optionally move only static sites to Contabo to free RAM/CPU on Hetzner.
• Best if: you value stability and hate migration weekends.

Vision D — Hetzner only
• Migrate Contabo → Hetzner: usually more expensive, only makes sense if Contabo is unreliable for you.
• Not recommended purely for cost.

───
8. Migration “correct way” (mental checklist — still no action)

If you later migrate Hetzner → Contabo, the correct order is:

Phase 0 — Inventory (1 evening)
List every domain on 46.62.228.173, every systemd unit, every Docker container, every cron, every secret path (/etc/default/*, PB data, Caddyfile).

Phase 1 — Capacity proof on Contabo (before DNS)
• Free RAM after current Contabo apps
• Peak: start TTS + analysis + 3 PB + Docker
• Watch OOM, swap, load for 24–48h

Phase 2 — Staging hostnames
• ielts-staging.… or hosts-file tests
• Restore from app-stack-exports + restic
• Caddy + TLS on staging names

Phase 3 — Data freeze window
• Final PB sqlite backup
• Final rsync of /var/www and configs
• Telegram/notifier secrets

Phase 4 — DNS
• Lower TTL 24–48h before
• Flip A records in batches (static first, IELTS last)
• Keep Hetzner running until metrics green

Phase 5 — Decommission
• Only after soak: disable Hetzner billing
• Keep last snapshot/export offline

Apps that should move first (low risk): static Promedic, credo, domains-hub, landings.
Apps that should move last (high risk): ielts.fast TTS + analysis.

───
9. Cost realism

┌──────────────────────────────────┬──────────────────┬────────────┬──────────────────────────┐
│ Path                             │ Money            │ Time       │ Risk                     │
├──────────────────────────────────┼──────────────────┼────────────┼──────────────────────────┤
│ Stay Hetzner + auto-pay          │ ~$40/mo          │ 0          │ Low                      │
├──────────────────────────────────┼──────────────────┼────────────┼──────────────────────────┤
│ Contabo 16GB+ everything         │ Often lower $/mo │ High setup │ Medium–high until proven │
├──────────────────────────────────┼──────────────────┼────────────┼──────────────────────────┤
│ Split Hetzner TTS + Contabo rest │ Medium           │ Medium     │ Lowest operational risk  │
├──────────────────────────────────┼──────────────────┼────────────┼──────────────────────────┤
│ Contabo 8GB “cheap”              │ Lowest $         │ High pain  │ High (OOM)               │
└──────────────────────────────────┴──────────────────┴────────────┴──────────────────────────┘

Also count your time: a botched IELTS migration costs more than 3–6 months of the Hetzner premium.

───
10. Direct answers to your questions

“Which is best to subscribe?”
• Best for proven IELTS/TTS stability: Hetzner (what you already validated).
• Best for $/RAM and bulk static/multi-site: Contabo (if SKU is fat enough).
• Best overall for you given both already exist: split workloads or Contabo-primary only after a capacity test — not emotion-based “Hetzner is expensive.”

“Is Hetzner too expensive?”
• Expensive vs Contabo: often yes.
• Expensive vs what it runs: no — 16 GB EU + your stack is not a $10 VPS job.
• Your recent outage was billing process, not “Hetzner compute is bad.”

“Do you recommend only Contabo?”
• Only Contabo: acceptable if you buy ≥16 GB, migrate in phases, and accept risk.
• I would not recommend “only Contabo + small RAM” for IELTS TTS.
• I would not recommend staying on Hetzner without auto-pay — that $40 null-route already taught the expensive lesson.

“Can I migrate apps correctly to Contabo?”
• Yes, for most sites.
• Yes with hard work, for IELTS Docker/PB.
• Conditional, for TTS — only with enough RAM and a restore drill.
• Correct way = inventory → capacity proof → staging → batch DNS → soak → cancel Hetzner.
• Incorrect way = point DNS at Contabo and hope.

───
11. What you should compare before any action (your trial plan)

Do this yourself when ready — still no production cutover:

1. Open Contabo panel: exact RAM/CPU/disk price for a plan ≥ current Hetzner.
2. On Contabo: free RAM now vs after hypothetical IELTS stack.
3. Restore one static site from export (practice).
4. Restore PocketBase sample to a side port (practice).
5. Time a TTS cold start and one inference on Contabo hardware if you trial it.
6. List domains still on 46.62.228.173 (length of DNS work).
7. Decide: Vision A / B / C above.

───
12. Bottom-line recommendation (opinion, not an order)
┌───────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Priority                      │ Recommendation                                                                                            │
├───────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ If goal = save money hard     │ Plan Contabo as primary only on a 16 GB+ plan; migrate static first; IELTS last; keep Hetzner until soak. │
├───────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ If goal = sleep at night      │ Keep Hetzner for IELTS/TTS; use Contabo for Master1/static; enable Hetzner auto-pay.                      │
├───────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ If goal = simplicity one bill │ Contabo-only is possible but is a project, not a toggle — budget days and a rollback.                     │
├───────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Do not                        │ Cancel Hetzner before a successful restore+smoke test on Contabo.                                         │
└───────────────────────────────┴───────────────────────────────────
